package config

import (
	"os"

	internalConfig "github.com/ChuranNeko/gginx/internal/config"
	"github.com/ChuranNeko/gginx/internal/logger"
	"github.com/fsnotify/fsnotify"
	"gopkg.in/yaml.v2"
)

// Watcher 配置文件监视器
type Watcher struct {
	watcher    *fsnotify.Watcher
	configPath string
	logger     *logger.Logger
}

// LoadConfig 加载配置文件
func LoadConfig(path string) (*internalConfig.Config, error) {
	data, err := os.ReadFile(path)
	if err != nil {
		return nil, err
	}

	var config internalConfig.Config
	if err := yaml.Unmarshal(data, &config); err != nil {
		return nil, err
	}

	return &config, nil
}

// NewWatcher 创建新的配置监视器
func NewWatcher(configPath string) (*Watcher, error) {
	watcher, err := fsnotify.NewWatcher()
	if err != nil {
		return nil, err
	}

	return &Watcher{
		watcher:    watcher,
		configPath: configPath,
		logger:     logger.NewLogger(),
	}, nil
}

// Watch 开始监视配置文件变化
func (w *Watcher) Watch() error {
	if err := w.watcher.Add(w.configPath); err != nil {
		return err
	}

	go func() {
		for {
			select {
			case event, ok := <-w.watcher.Events:
				if !ok {
					return
				}
				w.handleEvent(event)
			case err, ok := <-w.watcher.Errors:
				if !ok {
					return
				}
				w.logger.Error("配置监视错误: %v", err)
			}
		}
	}()

	return nil
}

// handleEvent 处理配置文件变化事件
func (w *Watcher) handleEvent(event fsnotify.Event) {
	if event.Op&fsnotify.Write == fsnotify.Write {
		w.logger.Info("配置文件发生变化，正在重新加载...")
		if _, err := LoadConfig(w.configPath); err != nil {
			w.logger.Error("重新加载配置文件失败: %v", err)
		}
	}
}

// Close 关闭监视器
func (w *Watcher) Close() error {
	return w.watcher.Close()
}
